﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tibet.Entidades;
using System.Collections;
using Tibet.Logica.Comandos;

namespace Tibet.Logica.Comandos.ComandoMotorRegla
{
    public class ConsultarComentarioBoilerplate :CrearRegla 

    {

        public override void Ejecutar()
        {
            //variables iniciales
            int AnchoLinea; //Almacena el tamaño de cada linea del archivo.
            int i = 0;     //contador de iteraciones para los ciclos(for).   
            int LineaActual = 0; //lineaactual que se esta leyendo.
            Resultado resp = new Resultado();//inicializo el objeto que sera retornado

            bool encapInt = false;
            bool encapString = false;
            bool encapbool = false;
            bool esVoid = false;

            bool inicioComentario = false;

            bool inicioBloqueComentario = false; //inicializo este auxiliar en falso, este me ayudara en determinar si se abrio un bloque /* y deba cerrarlo

            //se inicializa resp asumiendo caso de fallo(no cumple con la regla)
            resp.Fecha = new DateTime();
            resp.Fecha = DateTime.Now;
            resp.Respuesta = false;
            resp.Mensaje = "la clase del archivo no esta documentada acorde la regla";
            resp.Linea = 0;

            try
            {
                List<EntidadString> listaStr = new List<EntidadString>();

                for (int j = 0; j < ListaEntidad.Count; j++)
                {
                    listaStr.Add((EntidadString)ListaEntidad.ElementAt(j));
                }

                foreach (EntidadString linea in listaStr)   //Recorro la lista linea por linea
                {
                    LineaActual++;

                    if (linea.Linea.Length != 0)          //si la linea no esta vacia entro y lo analizo
                    {
                        AnchoLinea = linea.Linea.Length;  //indicamos la cantidad maxima de espacios que tiene la linea
                        i = 0;                      //reiniciamos el contador;
                        while (i < AnchoLinea)      //Recorremos la linea caracter por caracter  
                        {

                            if (linea.Linea[i] == '/' && linea.Linea[i + 1] == '/')    //si encontramos la cadena //
                            {
                                //if (eslineaDeClase == true && LineaActual == lineaAbajoDeClase) // pregunto si estoy en la linea de clase o en la linea siguiente
                                inicioComentario = true;


                            }

                            if (linea.Linea[i] == 'p')
                                if (linea.Linea[i + 1] == 'u')
                                    if (linea.Linea[i + 2] == 'b')
                                        if (linea.Linea[i + 3] == 'l')
                                            if (linea.Linea[i + 4] == 'i')
                                                if (linea.Linea[i + 5] == 'c')
                                                    if (inicioComentario == true)
                                                    {

                                                        for (int j = i + 6; j < AnchoLinea; j++)//realizo un recorrido para evaluar los posibles casos despues del public
                                                        {

                                                            if (linea.Linea[j] == 'v')
                                                                if (linea.Linea[j + 1] == 'o')
                                                                    if (linea.Linea[j + 2] == 'i')
                                                                        if (linea.Linea[j + 2] == 'd')
                                                                        {
                                                                            esVoid = true;
                                                                        }


                                                            if (linea.Linea[j] == 'i')
                                                                if (linea.Linea[j + 1] == 'n')
                                                                    if (linea.Linea[j + 2] == 't')
                                                                    {
                                                                        if (esVoid == false)
                                                                            encapInt = true;



                                                                    }//si es un encapsulamient int


                                                            if (linea.Linea[j] == 'S')
                                                                if (linea.Linea[j + 1] == 't')
                                                                    if (linea.Linea[j + 2] == 'r')
                                                                        if (linea.Linea[j + 3] == 'i')
                                                                            if (linea.Linea[j + 4] == 'n')
                                                                                if (linea.Linea[j + 5] == 'g')
                                                                                {

                                                                                    if (esVoid == false)
                                                                                        encapString = true;


                                                                                }//si es un encapsulado String

                                                            if (linea.Linea[j] == 'b')
                                                                if (linea.Linea[j + 1] == 'o')
                                                                    if (linea.Linea[j + 2] == 'o')
                                                                        if (linea.Linea[j + 3] == 'l')
                                                                        {

                                                                            if (esVoid == false)
                                                                                encapbool = true;

                                                                        }//si es un encapsulado bool


                                                        }
                                                    }


                            if ((encapbool == true || encapInt == true || encapString == true) && inicioComentario == true)
                            {
                                resp.Linea = LineaActual;
                                resp.Respuesta = true;
                                resp.Mensaje = "El archivo Esta documentado correctamente";
                                Entidad = (resp as Entidad);

                            }


                            if (linea.Linea[i] == '/' && linea.Linea[i + 1] == '*')//pregunto si se inicializa un bloque de comentarios
                            {
                                inicioBloqueComentario = true;          //inicializo el auxiliar para aguardar en la siguiente iteracion que finalice el bloque
                            }

                            if (linea.Linea[i] == '*' && linea.Linea[i + 1] == '/')//pregunto si existe un cierre de comentarios
                            {
                                if (inicioBloqueComentario == true)// && LineaActual> lineaAbajoDeClase)// si originalmente se inicio el bloque, aqui indico que esta bien documentado
                                {
                                    resp.Linea = LineaActual;
                                    resp.Respuesta = true;
                                    resp.Mensaje = "El archivo esta documentado correctamente";
                                    Entidad = (resp as Entidad);
                                }
                                else if (inicioBloqueComentario == false)//de lo contrario, indico que hay un error en la estructura del comentario y mando el mensaje de error
                                {
                                    //ej:    solo hay un */  nunca se  creo el /* antes
                                    resp.Linea = LineaActual;
                                    resp.Respuesta = false;
                                    resp.Mensaje = "El archivo no contiene una buena estructura de comentarios en la linea " + LineaActual;
                                    Entidad = (resp as Entidad);
                                }
                            }

                            i++;
                        }
                    }

                }

            }
            catch (Exception e)
            {
                resp.Linea = LineaActual;
                resp.Respuesta = false;
                resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                Entidad = (resp as Entidad);
            }

            Entidad = (resp as Entidad);


        }     
        
        
        
        
        
    }
}
